package com.nextel.project.pedido.mvc.validate;

import com.nextel.ui.OGridObjectRow;
import com.nextel.ui.custom.ConstantesItems;
import com.nextel.ui.custom.TableEditListener;
import com.nextel.project.Configuracion;
import com.nextel.project.pedido.ControlPedido;
import com.nextel.project.pedido.bean.PedidoBean;
import com.nextel.project.pedido.bean.PedidoDetalleBean;
import com.nextel.project.pedido.mvc.MVCProductoPedido;
import com.nextel.project.usuario.ControlUsuario;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.math.MathUtil;

/**
 *
 * @author edgard
 */
public class ValidateProductoPedidoForm implements TableEditListener {
    
    // indica la columna de ingreso de cantidad
    private int COLUMNA_CODIGO = 0;
    private int COLUMNA_CANTIDAD = 1;
    private int COLUMNA_DESCUENTO = 2;
    private int COLUMNA_TOTAL = 3;
    private final static int TAM_PROD_BUSCAR = 7;
    private final static int TAM_NOMBRE_LINEAS_MOSTRAR = 2;
    private MVCProductoPedido mvc;
    private boolean flagEditable = true;
//    private String CantAnt;
    //private boolean flagDecimal = false;
    //   PedidoDetalleBean actionBussinesst.getCurrentPedidoDetalle();
    
    public ValidateProductoPedidoForm(MVCProductoPedido mvc) {
        this.mvc = mvc;
        
        int contador = 0;
        
        COLUMNA_CODIGO = contador;
        COLUMNA_CANTIDAD = ++contador;
        
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
            COLUMNA_DESCUENTO = ++contador;
        }
        
        COLUMNA_TOTAL = ++contador;
        
    }
    
    public boolean validarAgregar() {
        //#debug
//        System.out.println("validarAgregar");
        return !verificarSiExiste() && validarFilasVacias();
    }
    
    public boolean validarEliminar() {
        //#debug
//        System.out.println("validarEliminar");
//        System.out.println("mvc.getTable().getValor(COLUMNA_CODIGO)=" + mvc.getTable().getValor(COLUMNA_CODIGO));
        ControlPedido.getInstance().currentPedido.removeArticulo(mvc.getTable().getValor(COLUMNA_CODIGO));
//        System.out.println("ControlPedido.getInstance().currentPedido.size==" + ControlPedido.getInstance().currentPedido.getLstPedidoDetalle().size());
        return true;
    }
    
    // cuando el usuario escribe en cada celda
    public void dataChange() {
//        System.out.println("dataChange");
        
        if (mvc.getTable().getColumna() == COLUMNA_CODIGO) {
            if (mvc.getTable().getValor(COLUMNA_CODIGO).length() == TAM_PROD_BUSCAR) {
                mvc.getTable().keyPressed(ConstantesItems.KEY_RIGHT);
            }
        } else if (mvc.getTable().getColumna() == COLUMNA_CANTIDAD) {
            calcularFila();
            
        } else  if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
            
            if (mvc.getTable().getColumna() == COLUMNA_DESCUENTO) {
                calcularDescuento();
            }
            
        }
        
    }
    
     
    private void calcularDescuento() {
//        System.out.println("calcularDescuento");
        
        if (mvc.getTable().getValor(COLUMNA_DESCUENTO).equals(ControlPedido.getInstance().currentPedidoDetalle.getDescuento( ) ) ) {
            return;
        }
        
        ControlPedido.getInstance().currentPedidoDetalle.setDescuento(mvc.getTable().getValor(COLUMNA_DESCUENTO));
        
        // realiza el proceso del calculo
        ControlPedido.getInstance().currentPedidoDetalle.calcularMontoTotal();



        mvc.getTable().setDatosColumna(COLUMNA_TOTAL, Configuracion.CambiarSimbolo(MathUtil.setScale(ControlPedido.getInstance().currentPedidoDetalle.getMonto(), Configuracion.DECIMAL_PRESENTACION)));
        
        // recalcula el monto total
        calcularMontoTotal();
        // }
    }
    
    /**
     * Realiza el proceso de calculo del precio de la fila actual
     */
    private void calcularFila() {
//        //#debug
//        System.out.println("calcularFila");
        
        try {
            // si no varia la cantidad no se realiza el calculo
            // si los dos son vacios
            if (mvc.getTable().getValor(COLUMNA_CANTIDAD).equals(ControlPedido.getInstance().currentPedidoDetalle.getCantidad())) {
                return;
            }
//
//            // si son el mismo numero
//            if ( mvc.getTable().getValor(COLUMNA_CANTIDAD).equals(ControlPedido.getInstance().currentPedidoDetalle.getCantidad())) {
//                return;
//            }
            
            //System.out.println("mvc.getTable().getValor(COLUMNA_DESCUENTO)= "+mvc.getTable().getValor(COLUMNA_DESCUENTO));
            //System.out.println("mvc.getTable().getValor(COLUMNA_CANTIDAD)= "+mvc.getTable().getValor(COLUMNA_CANTIDAD));
            
           // System.out.println("get Cantidad= "+ControlPedido.getInstance().currentPedidoDetalle.getCantidad());
            //System.out.println("simbolo decimal ="+(String.valueOf(OEditableGrid.SIMBOLO_DECIMAL).trim()));
            
            ControlPedido.getInstance().currentPedidoDetalle.setCantidad(mvc.getTable().getValor(COLUMNA_CANTIDAD));
            if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
                ControlPedido.getInstance().currentPedidoDetalle.setDescuento( mvc.getTable().getValor(COLUMNA_DESCUENTO));
            }
            // si no se borra la cantidad
            if (!"".equals(ControlPedido.getInstance().currentPedidoDetalle.getCantidad()) &&
                    !".".equals(ControlPedido.getInstance().currentPedidoDetalle.getCantidad())) {
                // realiza el proceso del calculo
                ControlPedido.getInstance().currentPedidoDetalle.calcularMontoTotal();
                
                mvc.getTable().setDatosColumna(COLUMNA_TOTAL, Configuracion.CambiarSimbolo(MathUtil.setScale(ControlPedido.getInstance().currentPedidoDetalle.getMonto(), Configuracion.DECIMAL_PRESENTACION)));
                
            } else {
                mvc.getTable().setDatosColumna(COLUMNA_TOTAL, "");
                if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
                    mvc.getTable().setDatosColumna(COLUMNA_DESCUENTO, "");
                }
                
                //Deberia limpiarse tambien el total
                //Agregado Joel Coronado
                mvc.getTable().setDatosColumna(COLUMNA_TOTAL, "");
            }
            
            // recalcula el monto total
            calcularMontoTotal();
            
        } catch (Exception ex) {
            ex.printStackTrace();
            
        }
        
    }
    
    public void estadoAnterior() {
//        if (mvc.getTable().getColumna() == COLUMNA_CANTIDAD) {
//            if ( (!mvc.getTable().getValor(COLUMNA_CANTIDAD).equals("")) && ( !CantAnt.equals(mvc.getTable().getValor(COLUMNA_CANTIDAD)) ) && (!stockValido()) )  {
////                String cant = getCantidadTable();
////                ControlPedido.getInstance().currentPedidoDetalle.setStockArticulo( ControlPedido.getInstance().currentPedidoDetalle.getStockArticuloDB() );
//                mvc.getTable().setDatosColumna(COLUMNA_CANTIDAD, "");
//                mvc.getTable().setDatosColumna(COLUMNA_TOTAL, "");
//                mvc.setTitulo();
//                ControlUsuario.getInstance().showMensaje( "La cantidad ingresada es mayor al stock disponible", mvc.getScreen() );
//            }
//        }
    }
    
    /**
     * es cuando te posicionas en la celda de la tabla
     */
    public void estadoActual() {
        //#debug
//        
       // System.out.println("estadoActual" );
        
//        flagDecimal = false;
        
        // si ya se ingreso en la tabla se limpia la celda
        if (verificarSiExiste()) {
            ControlUsuario.getInstance().showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_PRODUCTO_EXISTE), mvc.getScreen());//"El producto ingresado ya existe en el pedido actual"
            mvc.getTable().setDatosColumna(COLUMNA_CODIGO, "");
            return;
        }
        
        //flagEditable = true;
        // realiza la busqueda
       // System.out.println("buscar 1" );
        PedidoDetalleBean dpedido = buscar(mvc.getTable().getValor(COLUMNA_CODIGO));
//        System.out.println("dpedido="+ dpedido);
        
        
        if (dpedido != null) {
            
            ControlPedido.getInstance().currentPedidoDetalle = (dpedido);
            
            //habilitarIngresoCampos(false, true, true, false);
            habilitarIngresoCampos(false, true, false);
            
            // cortamos el nombre del articulo
            
            String label = IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_STOCK)+": " + Configuracion.CambiarSimbolo(ControlPedido.getInstance().currentPedidoDetalle.getStockArticulo());//Stock
            label = label + " |" + ControlPedido.getInstance().currentPedidoDetalle.getNombreArticulo();
            
            mvc.getString().setLabel(label, TAM_NOMBRE_LINEAS_MOSTRAR);
//aqui cambio nom pro
            // if (ControlPedido.getInstance().currentPedidoDetalle.getNombreArticulo().length() > TAM_NOMBRE_PROD_MOSTRAR) {
            //     mvc.getString().setLabel(ControlPedido.getInstance().currentPedidoDetalle.getNombreArticulo().substring(0, TAM_NOMBRE_PROD_MOSTRAR));
            // } else {
            //   mvc.getString().setLabel(ControlPedido.getInstance().currentPedidoDetalle.getNombreArticulo(), 2);
            // }
            
//            CantAnt = mvc.getTable().getValor(COLUMNA_CANTIDAD);
            
        } else {
            
            //habilitarIngresoCampos(true, false, false, false);
            habilitarIngresoCampos(true, false, false);
            
            mvc.getTable().setDatosColumna(COLUMNA_CODIGO, "");
            mvc.getString().setLabel("---");
//            mvc.getString().setLabel("----");
        }
        mvc.repintaForm();
    }
    
    /**
     * Se habilita o deshabilita el ingreso de valores en la tabla
     * @param codigo
     */
    //private void habilitarIngresoCampos(boolean codigo, boolean cantidad, boolean decimal, boolean total) {
    private void habilitarIngresoCampos(boolean codigo, boolean cantidad, boolean total) {
        
        if (mvc.getTable().getColumna() == COLUMNA_CODIGO) {
            flagEditable = codigo;
        } else if (mvc.getTable().getColumna() == COLUMNA_CANTIDAD) {
            flagEditable = cantidad;
            
        } else  if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
            
            if (mvc.getTable().getColumna() == COLUMNA_DESCUENTO) {
                flagEditable = cantidad;
            }
        } else if (mvc.getTable().getColumna() == COLUMNA_TOTAL) {
            flagEditable = total;
        }
        
    }
    
    public boolean isEditable() {
//        //#debug
//        System.out.println("isEditable==" + flagEditable);
        
        return flagEditable;
    }
    
    /**
     * Realiza el proceso de busqueda del articulo
     * si no existe retorna nulo
     * @param String codigoArticulo
     * @return PedidoDetalleBean
     */
    public PedidoDetalleBean buscar(String codigoArticulo) {
        //#debug

        //System.out.println("buscar= |" + codigoArticulo + "|");
        
        // si es vacio retorna nulo
        if ("".equals(codigoArticulo)) {
            return null;
        }
        
        
        PedidoBean pedido = ControlPedido.getInstance().currentPedido;
        
        // 1.- realiza la busqueda el el pedido si ya existe
        PedidoDetalleBean dpedido = pedido.getDetallePedido(codigoArticulo);
        
        //2.- si no existe recien buscamos en la base de datos del equipo
        if (dpedido == null) {
            dpedido = ControlPedido.getInstance().buscarPorCodigoProducto(codigoArticulo);
            
            // 3.- si existe lo ingresamos en la lista del pedido
            if (dpedido != null) {
                pedido.setDetallePedido(dpedido);
            }
        }
        
        return dpedido;
        
    }
    
    private boolean verificarSiExiste() {
        int tam = mvc.getTable().getSizeDatos();
        if (tam > 0) {
            // obtenemos
            String codigoItem = mvc.getTable().getValor(COLUMNA_CODIGO);
            for (int i = 0; i < tam; i++) {
                // si es la misma fila no validar
                if (mvc.getTable().getLineSelected() == i) {
                    continue;
                }
                String codigo = mvc.getTable().getValor(i, COLUMNA_CODIGO);
                //
                if (codigoItem.equals(codigo)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    public boolean validarTabla() {

        //System.out.println("validarTabla");
        
        int tam = mvc.getTable().getSizeDatos();
        for (int i = 0; i < tam; i++) {
            
            // no validamos la ultima fila si solo si esta vacia
            if ((i == tam - 1) && (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals(""))) {
                return true;
            }
            
            //
         /*   System.out.println("columna_codigo= "+mvc.getTable().getValor(i, COLUMNA_CODIGO));
            System.out.println("columna_total= "+mvc.getTable().getValor(i, COLUMNA_TOTAL));
            System.out.println("columna_cantidad= "+mvc.getTable().getValor(i, COLUMNA_CANTIDAD));*/
            
            //
            
            //verifica que haya ingresado el codigo del producto
            if (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals("")) {
                 //System.out.println("COLUMNA_CODIGO false");
                return false;
            }
            // verifica que tenga monto
            if (mvc.getTable().getValor(i, COLUMNA_TOTAL).equals("")) {
                //System.out.println("COLUMNA_TOTAL false");
                return false;
            }
            
            if(!MathUtil.isNumber(mvc.getTable().getValor(i, COLUMNA_CANTIDAD))){
                //System.out.println("COLUMNA_CANTIDAD false");
                return false;
            }
            
           // System.out.println("currentUsuario.descuento [=" +
           //         ControlUsuario.getInstance().currentUsuario.descuento + "]");
            
            if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
                if(!MathUtil.isNumber(mvc.getTable().getValor(i, COLUMNA_DESCUENTO))){
                    //System.out.println("COLUMNA_DESCUENTO false");
                    return false;
                }
            }
            
            if (MathUtil.esMayorIgual("0", mvc.getTable().getValor(i, COLUMNA_CANTIDAD))) {
               //System.out.println("COLUMNA_CANTIDAD esMayorIgual false");
                return false;
            }
        }
        
 
        
        return true;
    }
    
    public boolean validarFilasVacias() {
        //#debug
//        System.out.println("validarTabla");
        
        int tam = mvc.getTable().getSizeDatos();
        
        for (int i = 0; i < tam; i++) {
            
            //verifica que haya ingresado el codigo del producto
            if (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals("")) {
                return false;
            }
            
            // verifica que tenga monto
            if (mvc.getTable().getValor(i, COLUMNA_TOTAL).equals("")) {
                return false;
            }
        }
        return true;
    }
    
    public void filaEliminada() {
//        System.out.println("filaEliminada");
        calcularMontoTotal();
    }
    
    public void calcularMontoTotal() {
        ControlPedido.getInstance().currentPedido.calcularMontoTotal();        
        mvc.setTitulo();
    }
    
    public boolean validateDataChange(char valor) {
        boolean flag = true;
        return flag;
    }
    
    public boolean isDecimal(char valor) {
        return false;
    }
    
    public void filaAgregada() {
    }
    
    public OGridObjectRow buildFila() {
        
        int numberOfColumns = 3;
        int contador = 0;
        
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
            numberOfColumns = 4;
            
        }
        OGridObjectRow row = new OGridObjectRow(numberOfColumns);
        
        row.addEditableCell(contador, "");
        
        row.addEditableCell(++contador, "");
        
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.descuento)) {
            row.addEditableCell(++contador, "");
        }
        
        row.addCell(++contador, "");
        
        return row;
    }
}
